/* 作用域 let var */

// 变量提升 全局作用域
// if (true) {
//   console.log(b); // 函数申明也会被提升
//   console.log(a); // var声明变量提升
//   var a = 123; // 可以被访问
//   // let a = 123; // 不可以被块外面访问
//   function b() {
//     return 4;
//   }
// }
// console.log(a);
// console.log('--------------');

// var就很扯淡，下面的代码也不会报错
// var c = 23;
// var c = function () {};
// console.log(c);
// console.log('--------------');

// var的确扯淡2
// for (var i = 0; i < 3; i++) {
//   for (var i = 0; i < 3; i++) {
//     console.log(i); // 只打印3次
//   }
// }
// console.log('-------------');

// let很香
// for (var i = 0; i < 3; i++) {
//   for (let i = 0; i < 3; i++) {
//     console.log(i); // 打印9次
//   }
// }

// console.log('---------');

// var在实际开发中的问题
var elements = [{}, {}, {}];
// for (var i = 0; i < elements.length; i++) {
//   elements[i].onclick = function () {
//     console.log(i);
//   };
// }
// elements[0].onclick();
// console.log('---------');

// ES2015之前
// for (var i = 0; i < elements.length; i++) {
//   elements[i].onclick = (function (i) {
//     return function () {
//       console.log(i);
//     };
//   })(i);
// }
// elements[0].onclick();
// console.log('---------');

// ES2015之后
// var elements = [{}, {}, {}];
// for (let i = 0; i < elements.length; i++) {
//   elements[i].onclick = function () {
//     console.log(i);
//   };
// }
// elements[0].onclick();
// console.log('---------');

// let的好处
//- 第二行打印y, 本来输出作用域链上层的y，但是检测到y在内部作用域被定义，不能在初始化变量之前去引用它
// for (let y = 0; y < 3; y++) {
//   // console.log(y); // ReferenceError:  Cannot access 'y' before initialization
//   // 这里的y和下面的不是一个块作用域 所以互不影响
//   let y = 'foo';
//   console.log(y);
// }
// console.log(y); //  y is not defined y不在全局作用域
// console.log('---------');
// 模拟拆解上面的执行
// {
// let y = 0;
// if (y < 3) {
//   let y = 'foo';
//   console.log(y);
// }

// y++;

// if (y < 3) {
//   let y = 'foo';
//   console.log(y);
// }

// y++;

// if (y < 3) {
//   let y = 'foo';
//   console.log(y);
// }
// y++;
// }
